package com.chennan.algorithm.offer.eleven;

/**
 * @author chennan
 * @create 2021-11
 *
 *
 *
 *
 * ////////////////////////////////////////////////////////////////////////////////////////////
 * 基础复习：
 * byte 类型 -》-128（-2^7）~127(2^7-1)  1字节，8位
 * short 类型 -》 -32768（-2^15）~32767(2^15-1) 2字节 16位
 * int 类型-》-2,147,483,648（-2 ^ 31）~ 2,147,483,647（2 ^ 31 - 1） 4字节 32位
 *
 * 二进制转换Api：--》存在符号位
 * 十进制转二进制
 * Integer.toBinaryString(100);
 * 二进制转十进制
 * Integer.valueOf("100",2);
 * Java 负数二进制转十进制 需要按位取反+1后再进行转化。
 *与、或、异或
 * 与、或、异或的运算都是将两个数字转化为二进制数后，按位比较的，运算规律Java与Python一致，具体如下图：
 *
 * 与 （ & ）	0 & 0 = 0	1 & 0 = 0	0 & 1 = 0	1 & 1 = 1
 * 或（ | ）	0 | 0 = 0	1 | 0 = 1	0 | 1 = 1	1 | 1 = 1
 * 异或( ^ )	0 ^ 0 = 0	1 ^ 0 = 1	0 ^ 1 = 1	1 ^ 1 = 0
 * 与、或 操作符合日常逻辑，异或操作大家只要记住，相同为0 ，不同为1即可。
 *
 * PS: Java 在遇到与或是经常会顺带问问短路与 ( && ) 短路或（ || ）的区别，即遇到前半部分符合条件立即终止判断。
 *
 * 位移操作
 * 位运算分 左位移、右位移，符号对应<< 和 >>，简单来说就是将数字 m 向左、右移动n位。
 *
 * 如果是左移，最左边的n位将被丢弃，同时使用n个0进行补充至字符串末尾。
 *
 * 如果是右移，字符串末尾的n位被丢弃，但处理左边位时默认补0？No，针对Java等有符号位的语言，需要补充符号位，即正数补0，负数补1！
 * ----------------------------------------------------------------------------------------------
 * 剑指 Offer II 001. 整数除法
 * 给定两个整数 a 和 b ，求它们的除法的商 a/b ，要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。
 *
 * 注意：
 *
 * 整数除法的结果应当截去（truncate）其小数部分，例如：truncate(8.345) = 8 以及 truncate(-2.7335) = -2
 * 假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−231, 231−1]。本题中，如果除法结果溢出，则返回 231 − 1
 * 提示:
 *
 * 2 ^ 31 <= a, b <= 2 ^ 31 - 1
 * b != 0
 *
 * 示例：
 *
 * 示例 1：
 * 输入：a = 15, b = 2
 * 输出：7
 * 解释：15/2 = truncate(7.5) = 7
 *
 * 示例 2：
 * 输入：a = 7, b = -3
 * 输出：-2
 * 解释：7/-3 = truncate(-2.33333..) = -2
 *
 * 示例 3：
 * 输入：a = 0, b = 1
 * 输出：0
 *
 * 示例 4：
 * 输入：a = 1, b = 1
 * 输出：1
 *
 */
public class Adivide {

    public static void main(String[] args) {
//        System.out.println(Integer.toBinaryString(-1));
//        System.out.println(Integer.valueOf("1", 2));
        System.out.println(divide(100, 5));
//             1  2 3
        //5 41 5 10 20 40 80
    }

    public static int divide(int a, int b) {
        if(a==Integer.MIN_VALUE&&b==-1)return Integer.MAX_VALUE;
        int flag = 1;
        if(a>0){
            a=-a;
            flag = -flag;
        }
        if(b>0){
            b=-b;
            flag = -flag;
        }
        int count =0;


        while (a-b<=0){
            a=a-b;
            count++;
        }
        return flag>0?count:-count;
    }
}
